You are tasked with designing a user management system in a Spring Boot application. The system should adhere to the Single Responsibility Principle (SRP) from the SOLID principles. SRP states that a class should have only one reason to change, meaning that it should have only one responsibility.
public class User {
private String username;
private String password;
// Constructors, getters, and setters
}
import java.util.Optional;
public interface UserRepository {
Optional findByUsername(String username);
void save(User user);
// Additional methods for user management
}
import org.springframework.stereotype.Repository;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
@Repository
public class UserRepositoryImpl implements UserRepository {
private final Map users = new HashMap<>();
@Override
public Optional findByUsername(String username) {
return Optional.ofNullable(users.get(username));
}
@Override
public void save(User user) {
users.put(user.getUsername(), user);
}
}
import java.util.Optional;
public interface UserService {
Optional findUserByUsername(String username);
void registerUser(User user);
// Additional methods for user service
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Optional;
@Service
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
@Autowired
public UserServiceImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public Optional findUserByUsername(String username) {
return userRepository.findByUsername(username);
}
@Override
public void registerUser(User user) {
userRepository.save(user);
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
@RestController
@RequestMapping("/users")
public class MainController {
private final UserService userService;
@Autowired
public MainController(UserService userService) {
this.userService = userService;
}
@GetMapping("/{username}")
public String getUser(@PathVariable String username) {
Optional user = userService.findUserByUsername(username);
return user.map(value -> "User found: " + value.getUsername()).orElse("User not found");
}
@PostMapping("/register")
public String registerUser(@RequestBody User user) {
userService.registerUser(user);
return "User registered successfully";
}
}